MinCaml AArch64対応の記録
1月18日
AArch64アセンブリの練習
AArch64(64ビットARM)のアセンブリプログラムを書いたことが無いので練習を開始。4649(ヨロシク)を返すだけのプログラムを書くなどした。
1月24日
AArch64のスタックに苦戦中
AArch64でスタックを操作しようとするもエラーが出まくるので、以下を参考にAArch64のスタック操作の基本を練習した。
1月25日
AArch64アセンブリでフィボナッチ
AArch64アセンブリの基本が分かってきたので、フィボナッチ数を計算するプログラムをAArch64アセンブリで書いてみるなど。
2月1日
MinCamlでハローワールド
MinCamlのAArch64への移植を開始。まずは以下のような整数をプリントするだけのMinCamlのコードをAArch64アセンブリとして出力できるようにした。
MinCamlのコード
code:helloworld.ml
let x = 860 in print_int x; print_newline ()
出力されたアセンブリコード
code:helloworld.s
.text
.globl _min_caml_start
.align 2
_min_caml_start: # main entry point
add x28, x0, 0
add x27, x1, 0
add x28, x28, 16
# main program starts
mov x0, 860
mov x26, lr
add x28, x28, 8
bl _min_caml_print_int
sub x28, x28, 8
mov lr, x26
mov x26, lr
add x28, x28, 8
bl _min_caml_print_newline
sub x28, x28, 8
mov lr, x26
# main program ends
sub x28, x28, 16
ret
2月4日
MinCamlの中間コード出力
MinCamlコンパイラでは、MinCamlのコードからアセンブリコードを出力するまでの間にいくつかの中間コードへの変換が行われる。
MinCamlのコードがどのような中間コードに変換されているかを確認するため、中間コードを出力できるようにした。
2月7日
MinCamlの内と外とのスタック管理の違いに気付く
MinCamlのスタックはメモリの下位アドレス(0x00000000)から上位アドレス(0xffffffff)へ向かって伸びることが判明。上位アドレス(0xffffffff)から下位アドレス(0x00000000)へと伸びるC言語の世界のスタックをMinCamlへ渡すとスタック内のデータが破壊されてしまうため、MinCaml用のスタック領域を別途用意するようにした。
2月9日
MinCamlでフィボナッチが動いた
「関数呼び出し」や「if による条件分岐」を実装して、ついにMinCamlでフィボナッチが動くようになったよ〜
2月11日
クロージャが動かなくて泣いてる
(長い...)
「MinCaml移植の難所」と呼ばれているクロージャの実装を開始。休日を丸一日費やして無事にクロージャが動くようになりました。
2月13日
MinCamlでマンデルブロが動いた
MinCamlでマンデルブロが動くようになったぞー
浮動小数点数のレジスタへのロードに悩む
浮動小数点数のレジスタへのロード方法がわからず苦戦するも、C言語で書いた浮動小数点数を扱うコードを逆アセンブルすることで無事に切り抜けた。
2月15日
intとfloatの配列が動いた
Xcode便利〜
三角関数が欲しいか?
2月16日
末尾呼び出しのクロージャが動かなかった件
2月17日
MinCamlのtest/*.mlが通った
2月18日
できたてホヤホヤのMinCamlで雑にビルドしたレイトレーサのプロセスが、ゴミファイルを残して消えていった...
2月19日
闇夜のカラスかな?
レイトレが動いた